home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 3 / Amiga Format CD03 (1996-07-04)(Future Publishing)(GB)(Track 1 of 6)[!][issue 1996-08].iso / comms / netsoftware / nethandler.lha / NetHandler / dnet.h < prev    next >
C/C++ Source or Header  |  1989-09-16  |  8KB  |  228 lines

  1.  
  2. /*
  3.  *  DNET.H
  4.  *
  5.  *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  6.  *
  7.  */
  8.  
  9. #define DNET_H
  10.  
  11. #ifdef LATTICE
  12. #include <exec/types.h>
  13. #include <exec/nodes.h>
  14. #include <exec/lists.h>
  15. #include <exec/ports.h>
  16. #include <exec/libraries.h>
  17. #include <exec/devices.h>
  18. #include <exec/io.h>
  19. #include <exec/memory.h>
  20. #include <exec/interrupts.h>
  21. #include <intuition/intuition.h>
  22. #include <devices/console.h>
  23. #include <devices/timer.h>
  24. #include <libraries/dos.h>
  25. #include <libraries/dosextens.h>
  26. #include <libraries/filehandler.h>
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include <proto/exec.h>
  30. #include <proto/dos.h>
  31.  
  32. #define U_ARGS(a) a
  33.  
  34. #else
  35.  
  36. #define U_ARGS(a) ()    /* No support for prototypes - oh well */
  37.  
  38. #endif
  39.  
  40.  
  41. typedef unsigned char   ubyte;
  42. typedef unsigned short  uword;
  43. typedef unsigned long   ulong;
  44.  
  45. typedef struct MsgPort      PORT;
  46. typedef struct timerequest  IOT;
  47. typedef struct IOStdReq     IOR;
  48. typedef struct List         LIST;
  49. typedef struct Node         NODE;
  50. typedef struct Process      PROC;
  51. typedef struct Message      MSG;
  52.  
  53. #include "channel.h"
  54.  
  55. #ifndef MAX(a,b)
  56. #define MAX(a,b) (((a)>(b))?(a):(b))
  57. #endif
  58.  
  59. #define PKT struct _PKT
  60. #define PNODE   struct _PNODE
  61.  
  62. #define BTOC(yow)           ((ubyte *)((long)(yow) << 2))
  63. #define DNETPORTNAME        "DNET.UNIT."
  64. #define OFFSET(ptr,elem)    ((long)((char *)&(ptr)->elem - (char *)(ptr)))
  65.  
  66. #define EMPTY   0       /*  empty (sent)                    */
  67. #define READY   1       /*  data ready (not sent yet)       */
  68.  
  69. #define MAXCHAN 128     /*  Max # of channels supported     */
  70. #define SYNC    0xFF    /*  SYNC character                  */
  71. #define MAXPKT  200     /*  maximum packet size             */
  72. #define MINPKT  32      /*  minimum maximum packet size
  73.                             (for priority scheme)           */
  74.  
  75. #define OVERHEAD    7   /*  for packets with data           */
  76.  
  77. PNODE {
  78.     NODE    node;
  79.     char    name[32];
  80.     ulong   seg;
  81. };
  82.  
  83. PKT {
  84.     uword   iolength;   /*  send: length of packet, recv: length of data    */
  85.     ubyte   state;      /*  EMPTY, READY     */
  86.  
  87.     ubyte   sync;       /*  THE PACKET      */
  88.     ubyte   ctl;
  89.     ubyte   cchk;
  90.     ubyte   lenh;
  91.     ubyte   lenl;
  92.     ubyte   data[MAXPKT+2];
  93. };
  94.  
  95. /*  RECEIVER STATES    */
  96. #define RS_SYNC 0           /*  Waiting for sync                */
  97. #define RS_CTL  1           /*  Waiting for command             */
  98. #define RS_CCHK 2           /*  Waiting for check byte          */
  99. #define RS_LEN1 3           /*  Waiting for MSB length byte     */
  100. #define RS_LEN2 4           /*  Waiting for LSB length byte     */
  101. #define RS_DATA 5           /*  Waiting for data & checksum     */
  102.  
  103. #define DNCMD_OPEN      32  /*  Application open                */
  104. #define DNCMD_SOPEN     33  /*  Server open                     */
  105. #define DNCMD_CLOSE     34  /*  Close a channel                 */
  106. #define DNCMD_EOF       35  /*  Will no longer write to channel */
  107.  
  108. #define DNCMD_WRITE     36  /*  Write data to a channel         */
  109. #define DNCMD_QUIT      37  /*  Kill the DNET server            */
  110. #define DNCMD_IOCTL     38
  111.  
  112. /*  REQUEST TYPES    */
  113. #define RTO_REQ         1   /*  Network read timeout            */
  114. #define WTO_REQ         2   /*  Network write-ack timeout       */
  115. #define RNET_REQ        3   /*  Network read data               */
  116. #define WNET_REQ        4   /*  Network write data sent         */
  117. #define PKT_REQ         5   /*  Returned packets from servers   */
  118. #define OPEN_REQ        6
  119. #define IGWNET_REQ      7
  120.  
  121. /* PACKET CONTROL BYTE */
  122. #define PKF_SEQUENCE    0xE0    /*  Sequence #                  */
  123. #define PKF_DATA        0x10    /*  1-65535 bytes               */
  124. #define PKF_RESERVED    0x08    /*  reserved bit                */
  125. #define PKF_MASK        0x07    /*  command mask                */
  126.  
  127. #define PKCMD_WRITE     1       /*  A DATA packet               */
  128. #define PKCMD_CHECK     2       /*  Request ACK or NAK for win  */
  129. #define PKCMD_ACK       3       /*  ACK a window                */
  130. #define PKCMD_NAK       4       /*  NAK a window                */
  131. #define PKCMD_RESTART   5       /*  Restart                     */
  132. #define PKCMD_ACKRSTART 6       /*  Restart Acknowledge         */
  133. #define PKCMD_RESERVE3  7
  134. /*  CHANNEL COMMANDS    */
  135. #define SCMD_SWITCH     0x00    /*  switch active channel #     */
  136. #define SCMD_OPEN       0x01    /*  open a channel              */
  137. #define SCMD_CLOSE      0x02    /*  close a channel             */
  138. #define SCMD_ACKCMD     0x03    /*  ack an open/close request   */
  139. #define SCMD_EOFCMD     0x04    /*  Reof or Weof                */
  140. #define SCMD_QUIT       0x05    /*  crash dnet                  */
  141. #define SCMD_IOCTL      0x06    /*  ioctl                       */
  142.  
  143. #define SCMD_DATA       0x08    /*  stream command, DATA        */
  144.  
  145. #define CHAN_FREE       0x01    /*  free channel                */
  146. #define CHAN_ROPEN      0x02    /*  remote open, wait port msg  */
  147. #define CHAN_LOPEN      0x03    /*  local open, wait reply      */
  148. #define CHAN_OPEN       0x04
  149. #define CHAN_CLOSE      0x05    /*  see flags                   */
  150. #define CHANF_ROK       0x01    /*  NOT read eof                */
  151. #define CHANF_WOK       0x02    /*  remote will accept data     */
  152. #define CHANF_LCLOSE    0x04
  153. #define CHANF_RCLOSE    0x08
  154.  
  155. struct DChannel {
  156.     PORT    port;             /*  receive data, replies      */
  157.     PORT    *dnetport;        /* dnet's master port          */
  158.     LIST    rdylist;          /* ready to be read            */
  159.     uword   chan;             /* channel # for open channels */
  160.     ubyte   eof;              /* channel remotely closed/eof */
  161.     ubyte   filler;
  162.     int     qlen;             /* allowed write queue size    */
  163.     int     queued;           /* current # packets queued    */
  164. };
  165.  
  166. extern void  *ArbitrateNext();
  167.  
  168. #ifndef NOEXT
  169. extern IOT Rto;                /*  Read-Timeout/reset          */
  170. extern IOT Wto;                /*  Write-Timeout/retry         */
  171. extern IOR *RNet;              /*  read-request                */
  172. extern IOR *WNet;              /*  write-request               */
  173. extern PKT Pkts[9];
  174. extern PKT *Raux;              /*  next packet in              */
  175. extern PKT *RPak[4];
  176. extern PKT *WPak[4];
  177. extern PORT *DNetPort;         /*  Remote Command/Control in       */
  178. extern PORT *IOSink;           /*  Return port for ALL IO          */
  179. extern CHAN Chan[MAXCHAN];
  180. extern LIST TxList;            /*  For pending DNCMD_WRITE reqs.   */
  181. extern LIST SvList;
  182. extern ubyte Rto_act;
  183. extern ubyte Wto_act;
  184. extern uword RChan;
  185. extern uword WChan;
  186. extern uword RPStart;
  187. extern uword WPStart;
  188. extern uword WPUsed;
  189. extern uword RState;
  190. extern ubyte DDebug;
  191. extern ubyte Restart;
  192. extern ubyte DeldQuit;
  193. extern ubyte AutoHangup;
  194. extern ulong NumCon;
  195. extern ulong WTimeoutVal;
  196. extern ulong RTimeoutVal;
  197. extern long Baud;
  198. extern char *HostName;      /*   The Amiga's HostName    */
  199.  
  200. extern ubyte RestartPkt[3];
  201. extern ubyte AckPkt[8][3];
  202. extern ubyte NakPkt[8][3];
  203. extern ubyte CheckPkt[8][3];
  204. #endif
  205.  
  206. #ifdef LATTICE
  207. /* One #ifdef LATTICE is worth 1000 U_ARGS macros! */
  208. PORT *DListen(uword);
  209. void DUnListen(PORT *);
  210. PORT *DAccept(PORT *);
  211. DNAAccept(PORT *);
  212. void DPri(struct DChannel *, int);
  213. PORT *DOpen(char * /*host*/, uword /*portnum*/, 
  214.             char /*txpri*/, char /*rxpri*/);
  215. int DNRead(struct DChannel *, char *, int);
  216. int DRead(struct DChannel *, char *, int);
  217. void DQueue(struct DChannel *, int);
  218. DWrite(struct DChannel *, char *, int);
  219. void DEof(struct DChannel *);
  220. void DIoctl(struct DChannel *, ubyte, uword, ubyte);
  221. int DQuit(char *);
  222. void DClose(struct DChannel *);
  223. void WaitMsg(IOR *);
  224. int WaitQueue(struct DChannel *, IOR *);
  225.  
  226. #endif
  227.  
  228.